package com.cskaoyan._02sync;

import java.util.concurrent.TimeUnit;

/**
 * @description:
 * @author: 景天
 * @date: 2023/2/22 11:17
 **/
/*
sync的执行流程

2个线程A,B都想要访问sync中的内容
假设A线程先抢到Cpu的执行权，A执行，A线程看一下锁对象是否可用，可以用
A线程拿到锁对象， 进入到Sync中执行， 在这个过程中，如果发生了线程切换，切换到B线程
B线程执行，想要访问sync中的内容，但是没有锁对象，锁对象被A线程持有，对于B来讲，只能等待--》同步阻塞
重新切换A线程，A线程接着执行，直到退出sync代码块，释放锁对象
B线程就可以获取这个锁对象，B线程就可以访问sync代码块中的内容
 */
public class Demo4 {
    // 定义一把锁
    public static final Object OBJECT = new Object();
    public static void main(String[] args) {
        // 创建并启动一个线程
        new Thread(()->{
            System.out.println("t1线程执行了");
            // 使用同步代码块
            synchronized (OBJECT) {
                System.out.println("t1线程进入到了sync");

                // 休眠10s
                try {
                    TimeUnit.SECONDS.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                System.out.println("t1线程退出了sync");
            }

        },"t1").start();

        // main休眠1s 目的是为了保证t1线程先执行
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 创建并启动一个线程
        new Thread(()->{
            System.out.println("t2线程执行了");
            // 使用同步代码块
            // t2线程没有锁对象,不能够sync中的内容--->等待
            synchronized (OBJECT) {
                System.out.println("t2线程进入到sync中");

            }
            System.out.println("t2线程已经退出了sync");
        },"t2").start();
    }
}
